home *** CD-ROM | disk | FTP | other *** search
/ Technotools / Technotools (Chestnut CD-ROM)(1993).ISO / lang_oth / hdos / hdos.pro
Text File  |  1987-08-21  |  21KB  |  468 lines

  1. /*------------------------------------------------------------------------*/
  2. /*  A somewhat helpful DOS Assistant 06/11/86                             */
  3. /*------------------------------------------------------------------------*/
  4. /*  This program demonstrates how one might create a simplistic interface */
  5. /*  to DOS for the neophyte DOS user. Its a little rough around the edges */
  6. /*  because I didn't intend on making a career out of the program.        */
  7. /*  The program was a learning exercise for myself --- it is definitely   */
  8. /*  not a bullet-proof program. Therefore, it is submitted here primarily */
  9. /*  for your amusement. Who knows? There might be some ideas here that    */
  10. /*  you can use in other programs.                                        */
  11. /*                                       */
  12. /*  Note: Just in case, this was written on an IBM PC w/512K, 2 Floppy    */
  13. /*  drives, 20 meg Hard Disk, 2 Printers, 1 comm port, and monochrome     */
  14. /*  monitor.                                  */
  15. /*                                       */
  16. /*  When you run it, the selection menu uses the up/down arrows to move   */
  17. /*  the hightlight bar; to make a selection, press the enter key.         */
  18. /*                        Mark C. Paxton                    */
  19. /*------------------------------------------------------------------------*/
  20. domains
  21.   file             = editfile
  22.   stringlist         = string*
  23.   list                = symbol*        
  24.   row,column,length     = integer  
  25.   key                 = cr; escape; up; down; other
  26.   register         = integer
  27. /*------------------------------------------------------------------------*/
  28. database filename(string)
  29. /*------------------------------------------------------------------------*/  
  30. predicates
  31.   confirm(string)
  32.   repeat
  33.   write_option_list(list)
  34.   append(stringlist,stringlist,stringlist)
  35.   maxlen(list,integer,integer)
  36.   listlen(list,integer)
  37.   getkey(key)
  38.   translate_key(key,char,integer)
  39.   get_next_key_code(key,integer)
  40.   create_main_menu(row,column,string,list,integer)
  41.   display_highlight_bar(row,list,row,integer,integer)
  42.   move_highlight_up_down(row,list,row,integer,integer,key)
  43.   memsize(integer)
  44.   dosver(register,register)
  45.   diskspace(integer,real,real)
  46.   mkdir(string)
  47.   rmdir(string)
  48.   find_files(string,string)
  49.   retrieve_the_file_name(register)
  50.   get_dta_file_name(string,register,integer,integer)
  51.   find_rest(register,register,register)
  52.   build_file_name(string,string,integer,integer,integer)
  53.   write_error(string)
  54.   pad_spaces(string,integer,string)
  55.   fix_minutes(integer,string)
  56.   edit_process(file,symbol)
  57.   display_process(file,symbol)
  58.   edit_file
  59.   display_file
  60.   get_file_name(symbol)
  61.   convert_drive(string,integer)
  62.   display_stats(integer)
  63.   get_path_name(string)
  64.   convert_blank_path(string,string)    
  65.   fix_hours(integer,integer,string)
  66.   helpdos
  67.   mainmenu
  68.   process_selection(integer)  
  69. /*------------------------------------------------------------------------*/
  70. goal helpdos.
  71. /*------------------------------------------------------------------------*/
  72. clauses    
  73. /*------------------------------------------------------------------------*/
  74. /*   General Purpose Predicates                          */
  75. /*------------------------------------------------------------------------*/
  76.   append([],X,X).
  77.   append([H|T],L1,[H|L2]) :-     append(T,L1,L2).
  78.   maxlen([H|T],X,Y) :-        str_len(H,Length),    Length > X,
  79.                 !,            maxlen(T,Length,Y).
  80.   maxlen([_|T],X,Y) :-         maxlen(T,X,Y).
  81.   maxlen([],Length,Length).
  82.   listlen([],0).
  83.   listlen([_|T],N) :-        listlen(T,X),        N = X + 1.
  84.   write_option_list([H|[]]) :-    write(H),        !.
  85.   write_option_list([H|T])  :-    write(H,"\n"),        write_option_list(T).
  86.   repeat.
  87.   repeat :-             repeat.  
  88.   confirm("y") :-         !.
  89.   confirm("Y").
  90. /*------------------------------------------------------------------------*/
  91. /*   Miscellaneous                               */
  92. /*------------------------------------------------------------------------*/
  93.   pad_spaces(X,0,X) :-       !.
  94.   pad_spaces(FieldIn,Counter,FieldOut) :- 
  95.         C = Counter - 1,    fronttoken(ParmString,FieldIn," "),
  96.       pad_spaces(ParmString,C,FieldOut).
  97.  
  98.   get_path_name(DosPathName) :- 
  99.     makewindow(5,7,7,"Enter Response to Question:",5,5,3,70),
  100.       write("Enter path name or [ENTER]: "), 
  101.     readln(PathName),    removewindow,
  102.     convert_blank_path(PathName,DosPathName),
  103.     frontstr(1,DosPathName,Drive,_),
  104.     convert_drive(Drive,DiskNumber),
  105.     display_stats(DiskNumber).
  106.  
  107.   convert_blank_path("",NewPathName) :- 
  108.       !,            disk(NewPathName).
  109.   convert_blank_path(NewPathName,NewPathName) :- !.
  110.  
  111.   get_file_name(FileName) :- makewindow(4,7,7,"Select File",1,30,22,49),
  112.     dir("","*.*",FileName),    removewindow.    
  113.  
  114.   convert_drive("A",1) :-     !.
  115.   convert_drive("a",1) :-     !.
  116.   convert_drive("B",2) :-     !.
  117.   convert_drive("b",2) :-     !.
  118.   convert_drive("C",3) :-     !.
  119.   convert_drive("c",3) :-     !.
  120.   convert_drive("D",4) :-     !.
  121.   convert_drive("d",4) :-     !.
  122.   convert_drive("" ,X) :-       
  123.       disk(Path),        frontstr(1,Path,Drive,_),
  124.       convert_drive(Drive,X).
  125.  
  126.   display_stats(DiskNumber) :- 
  127.     shiftwindow(2),
  128.     cursor(14,2),        diskspace(DiskNumber,FreeSpace,TotalSpace),
  129.     dosver(Dos,SubVersion),
  130.     write("\n Dos Version: ",Dos,".",SubVersion),
  131.     disk(PathName),        write("\n Directory:   ",PathName),
  132.     write("\n Free Space:  ",FreeSpace),
  133.     write("\n Total Space: ",TotalSpace),
  134.     PercentFree = (FreeSpace * 100.0) / TotalSpace,
  135.     write("\n Percent Free:",PercentFree,"%"),
  136.     memsize(MemorySize),
  137.     write("\n Memory Size: ",MemorySize,"k"),
  138.     date(Year,Month,Day), 
  139.     write("\n ",Month,"/",Day,"/",Year,"     "),
  140.     time(H,Min,_,_),    fix_hours(H,Hours,AMPM),
  141.     fix_minutes(Min,Minutes),
  142.     write(Hours,":",Minutes," ",AMPM).
  143.  
  144.   fix_hours(H,Hours,"pm     ") :- 
  145.       H > 12,            !,            Hours = H - 12.
  146.   fix_hours(Hours,Hours,"am     ").
  147.   
  148.   fix_minutes(Min,Minutes) :- 
  149.       str_int(X,Min),        str_len(X,1),
  150.       !,            fronttoken(Minutes,"0",X).
  151.   fix_minutes(Min,Minutes) :- 
  152.       str_int(Minutes,Min).    
  153.  
  154.   write_error(ErrorMessage) :- 
  155.     shiftwindow(1),        clearwindow,
  156.     beep,            write(ErrorMessage).
  157. /*------------------------------------------------------------------------*/
  158.   create_main_menu(Row,Column,Text,OptionList,MenuSelection):-
  159.     maxlen(OptionList,0,Width),    
  160.     listlen(OptionList,Length),    
  161.     Length > 0,        WindowHeight = Length  + 2,
  162.     WindowWidth = Width + 4,
  163.     makewindow(3,7,7,Text,Row,Column,WindowHeight,WindowWidth),
  164.     write_option_list(OptionList),
  165.     HoldLength = Length,
  166.     cursor(0,0),        PassWidth = Width + 2,
  167.     display_highlight_bar(0,OptionList,HoldLength,PassWidth,Option),
  168.     MenuSelection = 1 + Option,
  169.     removewindow,        shiftwindow(2).
  170.  
  171.   display_highlight_bar(Row,OptionList,Length,Width,MenuSelection) :-
  172.     field_attr(Row,0,Width,112),
  173.     cursor(Row,0),        getkey(Key),
  174.     move_highlight_up_down(Row,OptionList,Length,Width,MenuSelection,Key).
  175.  
  176.   move_highlight_up_down(Row,_,_,_,Selection,cr) :- 
  177.       !,             Selection = Row.
  178.   move_highlight_up_down(Row,OptionList,Length,Width,MenuSelection,up) :-    
  179.       Row > 0,        !,
  180.     field_attr(Row,0,Width,7),
  181.     Row1 = Row - 1,        display_highlight_bar(Row1,OptionList,Length,Width,MenuSelection).
  182.   move_highlight_up_down(Row,OptionList,Length,Width,MenuSelection,down) :-
  183.     Row < Length - 1,    !,
  184.     field_attr(Row,0,Width,7),    
  185.     X1 = Row + 1,        display_highlight_bar(X1,OptionList,Length,Width,MenuSelection).
  186.   move_highlight_up_down(Row,OptionList,Length,Width,MenuSelection,_) :-
  187.     display_highlight_bar(Row,OptionList,Length,Width,MenuSelection).
  188.  
  189.   getkey(Key) :-     
  190.       readchar(KeyboardCharacter),
  191.       char_int(KeyboardCharacter,Value),
  192.         translate_key(Key,KeyboardCharacter,Value).
  193.  
  194.   translate_key(Key,_,0) :-     
  195.       !,            readchar(KeyboardCharacter),        
  196.     char_int(KeyboardCharacter,Value),
  197.     get_next_key_code(Key,Value).
  198.   translate_key(cr,_,13).
  199.  
  200.   get_next_key_code(up,72)   :-    !.
  201.   get_next_key_code(down,80) :-    !.
  202.   get_next_key_code(other,_).        
  203. /*------------------------------------------------------------------------*/
  204.   memsize(MemSize) :- 
  205.       bios($12,reg(0,0,0,0,0,0,0,0),reg(MemSize,_,_,_,_,_,_,_)).
  206. /*------------------------------------------------------------------------*/
  207.   dosver(Dos,SubVersion):-
  208.        bios($21,reg($3000,0,0,0,0,0,0,0),reg(AX,_,_,_,_,_,_,_)),
  209.        bitleft(AX,8,T),    
  210.        bitright(T,8,Dos),
  211.        bitright(AX,8,SubVersion).
  212. /*------------------------------------------------------------------------*/
  213.   diskspace(Disk,FreeSpace,TotalSpace) :-
  214.     bios($21,reg($3600,0,0,Disk,0,0,0,0),reg(AX,BX,CX,DX,_,_,_,_)),
  215.     FreeSpace  = 1.0 * BX * CX * AX,
  216.     TotalSpace = 1.0 * DX * CX * AX.
  217. /*------------------------------------------------------------------------*/
  218.   mkdir(PathName) :-        ptr_dword(PathName,DS,DX),
  219.        bios($21,reg($3900,0,0,DX,0,0,DS,0),_).
  220. /*------------------------------------------------------------------------*/
  221.   rmdir(PathName) :-        ptr_dword(PathName,DS,DX),
  222.        bios($21,reg($3A00,0,0,DX,0,0,DS,0),_).
  223. /*------------------------------------------------------------------------*/
  224.   find_files(FileName,FileString) :-    /* find file[s]; can handle global */
  225.       assert(filename("")),        /* store null entry */
  226.       ptr_dword(FileName,DS,DX),    /* point DS:DX to FileName */
  227.     bios($21,reg($4E00,0,0,DX,0,0,DS,0),reg(AX,_,_,_,_,_,_,_)), /* Find File */
  228.     retrieve_the_file_name(AX),    /* go see if we found a file */
  229.     find_rest(AX,DS,DX),        /* look for more matching files */
  230.     filename(FileString),        /* retrieve string of file names */
  231.     retract(filename(FileString)).     /* remove string of file names */
  232.  
  233.   retrieve_the_file_name(0) :-        /* file found */
  234.         !,                /* don't look any further */
  235.       bios($21,reg($2F00,0,0,0,0,0,0,0),reg(_,BX,_,_,_,_,_,ES)), /* get dta address */
  236.       Offset = BX + 30,        /* point Offset to Filename in DTA */
  237.       get_dta_file_name("",ES,Offset,13). /* pull file name from DTA */
  238.   retrieve_the_file_name(_).        /* file not found */
  239.  
  240.   find_rest(0,DS,DX) :-         /* matching file was found */
  241.       !,                /* don't look any further  */
  242.     bios($21,reg($4F00,0,0,DX,0,0,DS,0),reg(AX1,_,_,_,_,_,_,_)), /* find other files */
  243.     retrieve_the_file_name(AX1),    /* look for more matching files */
  244.     find_rest(AX1,DS,DX).        
  245.   find_rest(_,_,_).
  246.   
  247.   get_dta_file_name(FileString,_,_,0) :-/* done building name */
  248.          !,                /* don't look any further */
  249.          filename(X),            /* pull old string from database */
  250.          retract(filename(X)),        /* remove old string */
  251.     fronttoken(NewFileString,X,FileString),    /* add new file to string of file names */
  252.          asserta(filename(NewFileString)). /* place new string of file names in db */    
  253.   get_dta_file_name(FileString,ES,Offset,Counter) :-       /* build file name */
  254.     membyte(ES,Offset,Byte_value),    /* pull character out of DTA */
  255.     build_file_name(NewFileString,FileString,Byte_value,Counter,AdjCounter),
  256.     NewOffset  = Offset  + 1,    /* increment offset for next byte */
  257.     NewCounter = AdjCounter - 1,    /* decrement counter for remaining bytes */
  258.     get_dta_file_name(NewFileString,ES,NewOffset,NewCounter).
  259.  
  260.   build_file_name(NewFileString,FileString,0,_,1) :-    /* end of build */
  261.       !,
  262.     str_len(FileString,Length),    /* get length of file name */
  263.     NoBytes = 14 - Length,        /* how much to pad name to 14 bytes? */
  264.     pad_spaces(FileString,NoBytes,NewFileString). /* pad the file name */
  265.  
  266.   build_file_name(NewFileString,FileString,Byte_value,Counter,Counter) :-     
  267.       char_int(Character,Byte_value),
  268.       frontchar(NewCharacter,Character,""),
  269.     fronttoken(NewFileString,FileString,NewCharacter).
  270. /*------------------------------------------------------------------------*/               
  271.   edit_file :-        
  272.       makewindow(5,7,7,"Enter Response to Question Below:",5,5,3,72),
  273.         write("  Enter FILENAME to edit: "),
  274.         readln(DosFileName),    removewindow,
  275.         shiftwindow(1),        clearwindow,
  276.     write("  F1:Help F3:Find F4:Replace F5:Copy F6:Move F7:Del F8:Edit F9:ExtCopy F10:End"),
  277.     makewindow(5,7,7,DosFileName,0,0,24,80),
  278.         edit_process(editfile,DosFileName),
  279.         removewindow.
  280.  
  281.   edit_process(editfile,DosFileName) :-        /* Opens old file for edit */
  282.     existfile(DosFileName),
  283.     !,            openread(editfile,DosFileName),
  284.     readdevice(editfile),     file_str(DosFileName,Buffer),
  285.     closefile(editfile),     edit(Buffer,TextBuffer),
  286.     openwrite(editfile,DosFileName),
  287.     writedevice(editfile),
  288.     write(TextBuffer),     closefile(editfile).
  289.   edit_process(editfile,DosFileName) :-        /* Creates new edit file */
  290.     not(existfile(DosFileName)),
  291.     !,            openwrite(editfile,DosFileName),
  292.     edit("",TextBuffer),     writedevice(editfile),
  293.     write(TextBuffer),     closefile(editfile).
  294. /*------------------------------------------------------------------------*/
  295.   display_file :-        get_file_name(FileName),
  296.     shiftwindow(1),        clearwindow,        
  297.         makewindow(5,7,7,FileName,0,0,24,80),
  298.         display_process(editfile,FileName),
  299.         removewindow.
  300.  
  301.   display_process(editfile,DosFileName) :- 
  302.     existfile(DosFileName),
  303.     !,            openread(editfile,DosFileName), 
  304.     readdevice(editfile),    file_str(DosFileName,Buffer),
  305.     closefile(editfile),     display(Buffer).
  306.   display_process(editfile,DosFileName) :-
  307.     not(existfile(DosFileName)),
  308.     !,             shiftwindow(1),
  309.     clearwindow,         write_error("  File not found. ").
  310. /*------------------------------------------------------------------------*/
  311. /*   Main Body of Program                          */
  312. /*------------------------------------------------------------------------*/
  313.   helpdos :-            makewindow(1,120,0,"",24,0,1,80),
  314.          makewindow(2,7,7,"A Funky DOS Assistant",0,0,24,80),
  315.          makewindow(6,7,7,"Directory",1,30,22,44),
  316.          disk(DosPathName),       frontstr(1,DosPathName,Drive,_),
  317.     convert_drive(Drive,DiskNumber),
  318.     display_stats(DiskNumber),
  319.     cursor(2,2),        mainmenu.
  320. /*------------------------------------------------------------------------*/          
  321.   mainmenu :-            repeat,
  322.       disk(DosPathName),    frontstr(1,DosPathName,Drive,_),
  323.     convert_drive(Drive,DiskNumber),
  324.     display_stats(DiskNumber),
  325.     shiftwindow(6),        find_files("*.*",FileString),
  326.     clearwindow,        write(FileString),
  327.        shiftwindow(1),           write("  Select Option.  "),    
  328.        create_main_menu(0,1,"Options",
  329.                [ "Rename a File         ",   /*1*/
  330.                "Change Directories    ",   /*2*/       
  331.                   "Copy a File           ",   /*3*/
  332.                "Edit a File           ",   /*4*/
  333.                "Browse a File         ",   /*5*/
  334.                   "Execute a DOS Command ",   /*6*/
  335.                "Move a File           ",   /*7*/
  336.                    "Make a Sub Directory  ",   /*8*/
  337.                   "Remove a Sub Directory",   /*9*/
  338.            "Invoke DOS            ",   /*10*/
  339.            "Directory             ",   /*11*/
  340.            "Delete File           ",   /*12*/
  341.            "Find a File           ",   /*13*/
  342.            "Exit                  " ], /*14*/
  343.             MenuSelection), 
  344.          process_selection(MenuSelection),
  345.          fail.
  346. /*------------------------------------------------------------------------*/
  347.   process_selection(1)  :-              /* Rename a File */
  348.     get_file_name(DosFileName),
  349.     makewindow(5,7,7,"Enter Response to Question:",5,5,3,70),
  350.     write("  Enter New File Name: "),
  351.     readln(NewFileName),    renamefile(DosFileName,NewFileName),
  352.     removewindow,        !,
  353.     shiftwindow(1),        clearwindow,        
  354.     write(" File Renamed. ").
  355.   process_selection(1)  :- write_error(" File was not Renamed.  "),!.
  356. /*------------------------------------------------------------------------*/
  357.   process_selection(2) :-             /* Set path */    
  358.     get_path_name(DosPathName),
  359.     shiftwindow(2),        disk(DosPathName),    
  360.     !,            frontstr(1,DosPathName,Drive,_),
  361.     convert_drive(Drive,DiskNumber),
  362.     display_stats(DiskNumber),
  363.     shiftwindow(1),        clearwindow.
  364.   process_selection(2) :- write_error(" Error -- Directory not changed.  "),!.
  365. /*------------------------------------------------------------------------*/
  366.   process_selection(3)  :-             /* Copy */
  367.     shiftwindow(1),        get_file_name(DosFileName),
  368.     makewindow(5,7,7,"Enter Response to Question:",5,5,3,70),
  369.     write("  Enter full name of new file : "),
  370.     readln(NewFileName),    concat("copy ",DosFileName,St1),
  371.     concat(St1," ",St2),    concat(St2,NewFileName,Command),
  372.     removewindow,        system(Command),    
  373.     shiftwindow(1),        clearwindow,
  374.     existfile(NewFileName),    write("  File copied.    "),
  375.     !.
  376.   process_selection(3):-write_error("  File did not copy successfully.  "),!.
  377. /*------------------------------------------------------------------------*/
  378.   process_selection(4)  :-              /* Edit a file */
  379.       !,            edit_file,
  380.       shiftwindow(1),        clearwindow.        
  381. /*------------------------------------------------------------------------*/
  382.   process_selection(5)  :-              /* Browse a File */
  383.     !,            display_file,
  384.     shiftwindow(1),        clearwindow.
  385. /*------------------------------------------------------------------------*/
  386.   process_selection(6)  :-             /* Execute Dos/program */
  387.     makewindow(5,7,7,"Enter Response to Question:",5,5,3,70),
  388.     write("  Select Program to execute from window (Y/N): "),
  389.     readln(YesNo),        confirm(YesNo),
  390.     removewindow,        shiftwindow(1),        
  391.     clearwindow,        !,
  392.     get_file_name(Program), system(Program),    
  393.     shiftwindow(1),        clearwindow.        
  394.   process_selection(6)  :- makewindow(5,7,7,"Enter Response to Question:",5,5,3,70),
  395.     write("  Enter DOS Command or Program Name: "),
  396.     readln(Command),    removewindow,
  397.     system(Command),    shiftwindow(1),
  398.     clearwindow,        !.
  399. /*------------------------------------------------------------------------*/
  400.   process_selection(7)  :-             /* Move File */
  401.         shiftwindow(1),        get_file_name(DosFileName),
  402.     makewindow(5,7,7,"Enter Response to Question:",5,5,3,70),
  403.     write(" Enter destination of file: "),
  404.     readln(Destination),    concat("copy ",DosFileName,St1),
  405.     concat(St1," ",St2),    concat(St2,Destination,Command),
  406.     removewindow,        system(Command),    
  407.     shiftwindow(1),        clearwindow,
  408.     deletefile(DosFileName),write(" File moved. "),
  409.     !.
  410.   process_selection(7):-write_error("  File was not moved successfully.  "),!.
  411. /*------------------------------------------------------------------------*/
  412.   process_selection(8)  :-              /* MkDir */
  413.     makewindow(5,7,7,"Enter Response to Question:",5,5,3,70),
  414.     write("  Enter name of new Directory: "),
  415.     readln(Directory),    mkdir(Directory),
  416.     !,            removewindow,
  417.     shiftwindow(1),        clearwindow,        
  418.     write("  Directory created.  ").
  419.   process_selection(8)  :- write_error("Directory was not created.  "),!.
  420. /*------------------------------------------------------------------------*/
  421.   process_selection(9)  :-              /* RmDir */
  422.     makewindow(5,7,7,"Enter Response to Question:",5,5,3,70),
  423.     write("  Enter name of Directory to remove: "),
  424.     readln(Directory),    rmdir(Directory),
  425.     removewindow,
  426.     shiftwindow(1),        clearwindow,
  427.     !,            write("  Directory deleted.  ").
  428.   process_selection(9)  :- write_error("  Directory was not deleted.  "),!.
  429. /*------------------------------------------------------------------------*/
  430.   process_selection(10) :-             /* Execute DOS */
  431.       !,             system(""),
  432.       shiftwindow(1),        clearwindow.
  433. /*------------------------------------------------------------------------*/
  434.   process_selection(11)  :- !,             /* Directory */
  435.      system("dir > Temp.$$$"),
  436.      makewindow(5,7,7,"BROWSE CURRENT DIRECTORY",0,20,24,41),
  437.      display_process(editfile,"Temp.$$$"),
  438.      deletefile("Temp.$$$"),    removewindow.
  439. /*------------------------------------------------------------------------*/                  
  440.   process_selection(12) :-             /* Delete File */
  441.      get_file_name(DosFileName),
  442.      makewindow(5,7,7,"Enter Response to Question:",5,5,3,70),
  443.      write("   Confirm Delete (Y/N): "),
  444.      readln(Yes_No),        confirm(Yes_No),
  445.      deletefile(DosFileName),removewindow,
  446.      shiftwindow(1),        clearwindow,
  447.      write("  File Deleted.  "),        !.
  448.   process_selection(12) :- write_error("  Delete Aborted. "),!.
  449. /*------------------------------------------------------------------------*/
  450.   process_selection(13) :-             /* Find a File */
  451.       !,
  452.     makewindow(5,7,7,"Enter Response to Question:",5,5,3,70),      
  453.     write("  Enter File Name or Mask (e.g.: *.dat):  "),
  454.     readln(Mask),        removewindow,
  455.     find_files(Mask,FileString),
  456.     makewindow(6,7,7,"File(s) Found:",2,20,21,44),
  457.     write(FileString),    shiftwindow(1),
  458.     clearwindow,        
  459.     write("  Press [ENTER] when ready to continue...  "),
  460.     readln(_),        clearwindow,
  461.     shiftwindow(6),        removewindow,
  462.        shiftwindow(1),           write("  Select Option.  ").        
  463. /*------------------------------------------------------------------------*/
  464.   process_selection(14) :- 
  465.       removewindow,         removewindow,
  466.       exit.                    /* a non-elegant termination */     
  467. /*------------------------------------------------------------------------*/